7406f5
@@ -19,6 +19,7 @@
package org.springframework.expression.spel.ast;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.lang.reflect.Modifier;
+import java.lang.reflect.Proxy;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
@@ -260,7 +261,8 @@
public class MethodReference extends SpelNodeImpl {
 	@Override
 	public boolean isCompilable() {
 		CachedMethodExecutor executorToCheck = this.cachedExecutor;
-		if (executorToCheck == null || !(executorToCheck.get() instanceof ReflectiveMethodExecutor)) {
+		if (executorToCheck == null || executorToCheck.hasProxyTarget() ||
+				!(executorToCheck.get() instanceof ReflectiveMethodExecutor)) {
 			return false;
 		}
 
@@ -274,8 +276,7 @@
public class MethodReference extends SpelNodeImpl {
 		if (executor.didArgumentConversionOccur()) {
 			return false;
 		}
-		Method method = executor.getMethod();
-		Class<?> clazz = method.getDeclaringClass();
+		Class<?> clazz = executor.getMethod().getDeclaringClass();
 		if (!Modifier.isPublic(clazz.getModifiers()) && executor.getPublicDeclaringClass() == null) {
 			return false;
 		}
@@ -400,6 +401,10 @@
public class MethodReference extends SpelNodeImpl {
 					ObjectUtils.nullSafeEquals(this.target, target) && this.argumentTypes.equals(argumentTypes));
 		}
 
+		public boolean hasProxyTarget() {
+			return (this.target != null && Proxy.isProxyClass(this.target.getType()));
+		}
+
 		public MethodExecutor get() {
 			return this.methodExecutor;
 		}
